package com.rongji.cms.tools.db.strategy;

import com.rongji.cms.tools.db.constant.DbConstant;
import com.rongji.cms.tools.db.domain.vo.DbInfoVo;
import com.rongji.cms.tools.db.enums.DbEnum;
import com.rongji.cms.tools.db.utils.DbUtil;
import org.springframework.beans.factory.InitializingBean;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

/**
 * @author yang
 * @date 2023/1/29 13:27
 * @description 实现InitializingBean是为了在spring启动时候添加到工厂的map里，
 * 不需要跟spring结合的话，不用实现这个接口，直接在工厂类里添加
 */

public class MysqlDbStrategy implements DbStrategy, InitializingBean {


    /**
     * 获取连接
     *
     * @param dbInfo
     * @return
     */
    private Connection getConnection(DbInfoVo dbInfo) {
//        url字符串的拼接
//        只是为了学习使用Function，这里其实没啥必要这么做，能获取到url字符串就行
        String url=DbUtil.getConnUrl((sb)->{
            sb.append("jdbc:mysql://")
                    .append(dbInfo.getDbHost())
                    .append("/")
                    .append(dbInfo.getDbName())
                    .append("?useUnicode=true&useSSL=false&characterEncoding=utf8");
            return sb.toString();
        });


        Connection conn = DbUtil.getConnection(DbConstant.MYSQL_DRIVER,dbInfo, url);
        return conn;
    }


    @Override
    public <T> Map<String, Map<String, T>> getDBInfo(DbInfoVo dbInfo, Class<T> clazz) {

        Connection conn = getConnection(dbInfo);
//       查询字段属性的sql语句拼接
//       查询字段属性sql语句的一部分，传过去后跟获取到的tableName拼接成完整的语句
        String tabColumns="select * from information_schema.COLUMNS where TABLE_SCHEMA = '"
                +dbInfo.getDbName()
               +"' and TABLE_NAME = '";
        Map<String, Map<String, T>>  tableMap=DbUtil.getDBInfo(conn,DbConstant.MYSQL_TABLE_NAME,tabColumns,clazz);

        return tableMap;
    }


    @Override
    public void afterPropertiesSet() {
        DbStrategyFactory.register(DbEnum.MYSQL.getValue(), this);
    }
}
